#include "uart.c"

sbit KEY_INC = P2^0;  // 加1按键
sbit KEY_DEC = P2^5;  // 减1按键

unsigned char num = 0;  // 严格8位变量
unsigned int print_timer = 0;

// 新增长按相关变量
bit inc_long_press = 0;    // 加键长按标志
bit dec_long_press = 0;    // 减键长按标志
unsigned char long_press_counter = 0;  // 长按打印计数器

void delay_ms(unsigned int ms) {
    unsigned int i, j;
    for(i=0; i<ms; i++)
        for(j=0; j<123; j++);
}

void main() {
    uart_init();
    
    while(1) {
        // 加键处理（带消抖）
        if(KEY_INC == 0) {
            delay_ms(20);
            if(KEY_INC == 0) {
                // 判断是否已长按
                if(!inc_long_press) {
                    // 首次按下
                    if(num < 255) num++;
                    printf("Num: %u\r\n", (unsigned int)num);
                }
                
                inc_long_press = 1;  // 设置长按标志
                
                // 等待释放
                while(KEY_INC == 0) {
                    // 长按期间每秒打印当前值
                    print_timer++;
                    if(print_timer >= 1000) {
                        printf("Current: %u\r\n", (unsigned int)num);
                        print_timer = 0;
                        
                        // 长按计数器增加
                        long_press_counter++;
                        
                        // 每三次打印相同值后加1
                        if(long_press_counter >= 3) {
                            if(num < 255) num++;
                            long_press_counter = 0; // 重置计数器
                        }
                    }
                    delay_ms(1);
                }
                // 释放后重置长按状态
                inc_long_press = 0;
                long_press_counter = 0;
            }
        }
        
        // 减键处理（带消抖）
        if(KEY_DEC == 0) {
            delay_ms(20);
            if(KEY_DEC == 0) {
                // 判断是否已长按
                if(!dec_long_press) {
                    // 首次按下
                    if(num > 0) num--;
                    printf("Num: %u\r\n", (unsigned int)num);
                }
                
                dec_long_press = 1;  // 设置长按标志
                
                // 等待释放
                while(KEY_DEC == 0) {
                    // 长按期间每秒打印当前值
                    print_timer++;
                    if(print_timer >= 1000) {
                        printf("Current: %u\r\n", (unsigned int)num);
                        print_timer = 0;
                        
                        // 长按计数器增加
                        long_press_counter++;
                        
                        // 每三次打印相同值后减1
                        if(long_press_counter >= 3) {
                            if(num > 0) num--;
                            long_press_counter = 0; // 重置计数器
                        }
                    }
                    delay_ms(1);
                }
                // 释放后重置长按状态
                dec_long_press = 0;
                long_press_counter = 0;
            }
        }
        
        // 定时打印（1秒间隔） - 仅在非长按状态有效
        if(!inc_long_press && !dec_long_press) {
            print_timer++;
            if(print_timer >= 1000) {
                printf("Current: %u\r\n", (unsigned int)num);
                print_timer = 0;
            }
            delay_ms(1);
        }
    }
}